package org.redmaple.core.util;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.util.StringUtils;

/**
 * 时间辅助工具类
 * 
 * @author Xiangyun
 */
public final class DateUtils {

	/**
	 * 将java.util.Date类型的时间，根据指定的格式枚举类型转化为字符串，由于java.sql.Date、java.sql.Timestamp
	 * 、java.sql.Time都继承于java.util.Date，因此可调用此方法进行转换
	 * 
	 * @param date
	 *            要转换的时间
	 * @param dateFormatter
	 *            指定的格式枚举类型
	 * @return 转换得到的时间字符串
	 */
	public static String format(Date date, DateFormatter dateFormatter) {
		if (date == null)
			return "";
		if (dateFormatter == null) {
			dateFormatter = DateFormatter.DATE_FORMAT;
		}
		return format(date, dateFormatter.getFormatter());
	}

	/**
	 * 将java.util.Date类型的时间，根据指定的格式类型转化为字符串，由于java.sql.Date、java.sql.Timestamp
	 * 、java.sql.Time都继承于java.util.Date，因此可调用此方法进行转换
	 * 
	 * @param date
	 *            要转换的时间
	 * @param dateFormatter
	 *            指定的格式类型
	 * @return 转换得到的时间字符串
	 */
	public static String format(Date date, String dateFormatter) {
		if (date == null)
			return "";
		if (StringUtils.isEmpty(dateFormatter)) {
			dateFormatter = DateFormatter.DATE_FORMAT.getFormatter();
		}
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormatter);
		return sdf.format(date);
	}

	/**
	 * 将时间字符串根据指定的格式枚举类型转化为java.util.Date的时间对象
	 * 
	 * @param strDate
	 *            要转换的时间字符串
	 * @param dateFormatter
	 *            指定的格式枚举类型
	 * @return 转换得到的时间对象
	 * @throws ParseException
	 *             当 <code>strDate</code> 参数内容不合法时，抛出该异常。
	 */
	public static Date parse(String strDate, DateFormatter dateFormatter)
			throws ParseException {
		if (StringUtils.isEmpty(strDate))
			return null;
		if (dateFormatter == null) {
			dateFormatter = DateFormatter.DATE_FORMAT;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(
				dateFormatter.getFormatter());
		return sdf.parse(strDate);
	}

	/**
	 * 将时间字符串根据指定的格式类型转化为java.util.Date的时间对象
	 * 
	 * @param strDate
	 *            要转换的时间字符串
	 * @param dateFormatter
	 *            指定的格式类型
	 * @return 转换得到的时间对象
	 * @throws ParseException
	 *             当 <code>strDate</code> 参数内容不合法时，抛出该异常。
	 */
	public static Date parse(String strDate, String dateFormatter)
			throws ParseException {
		if (StringUtils.isEmpty(strDate))
			return null;
		if (StringUtils.isEmpty(dateFormatter)) {
			dateFormatter = DateFormatter.DATE_FORMAT.getFormatter();
		}
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormatter);
		return sdf.parse(strDate);
	}

	/**
	 * 将正确的时间字符串转化为 java.sql.Date 类型的日期对象。<br/>
	 * 如果时间字符串不合法则返回 <code>null</code>
	 * 
	 * @param strDate
	 *            要转换的日期字符串
	 * @return 转换后的java.sql.Date 日期对象
	 */
	public static java.sql.Date parseToSqlDate(String strDate) {
		try {
			Date date = parse(strDate, DateFormatter.DATE_FORMAT);
			return new java.sql.Date(date.getTime());
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将正确的时间字符串转化为 java.sql.Time 类型的时刻对象。<br/>
	 * 如果时间字符串不合法则返回 <code>null</code>
	 * 
	 * @param strDate
	 *            要转换的时刻字符串
	 * @return 转换后的java.sql.Time 时刻对象
	 */
	public static Time parseToSqlTime(String strDate) {
		try {
			Date date = parse(strDate, DateFormatter.TIME_FORMAT);
			return new Time(date.getTime());
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将正确的时间字符串转化为 java.sql.Timestamp 类型的时间对象。<br/>
	 * 如果时间字符串不合法则返回 <code>null</code>
	 * 
	 * @param strDate
	 *            要转换的时间字符串
	 * @return 转换后的java.sql.Timestamp 时间对象
	 */
	public static Timestamp parseToSqlTimestamp(String strDate) {
		try {
			Date date = parse(strDate, DateFormatter.TIME_FORMAT);
			return new Timestamp(date.getTime());
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 获取一个当前日期的java.sql.Date对象
	 * 
	 * @return 当前日期的java.sql.Date对象
	 */
	public static java.sql.Date getCurrentSQLDate() {
		return new java.sql.Date(new Date().getTime());
	}

	/**
	 * 获取一个当前时刻的java.sql.Time对象
	 * 
	 * @return 当前时刻的java.sql.Time对象
	 */
	public static Time getCurrentTime() {
		return new Time(new Date().getTime());
	}

	/**
	 * 获取一个当前时间的java.sql.Timestamp对象
	 * 
	 * @return 当前时间的java.sql.Timestamp对象
	 */
	public static Timestamp getCurrentTimestamp() {
		return new Timestamp(new Date().getTime());
	}
}
